const express = require("express");
const util = require("../common/util");
const ShelfItemDB = require('../model/db/shelfItem');
const UserDB = require('../model/db/user');
const ItemDB = require('../model/db/item');


async function add(req, res) {
    try {
        // 创建一个符合数据库模型的货架层物品对象
        const shelfItem = {
            shelfId: req.body.shelfId,
            layerNumber: req.body.layerNumber,   
            itemId: req.body.itemId
        };

        // 获取数据库操作实例
        db = ShelfItemDB.getInstance();

        // 执行添加操作
        const result = await db.add(shelfItem);

        // 检查是否添加成功
        if (result > 0) {
            // 添加成功，返回201状态码和货架物品信息
            res.json(util.FormatJSONData(201, '货架层物品新增成功', shelfItem));
        } else {
            // 添加失败，返回错误信息
            res.status(400).json(util.FormatJSONData(400, '货架层物品新增失败', '没有货架物品被添加'));
        }
    } catch (error) {
        // 处理错误
        util.err(error);

        // 返回服务器内部错误响应
        res.status(500).json(util.FormatJSONData(500, '服务器内部错误', error));
    }
}

async function outbound(req, res){
    try {
        const db = ShelfItemDB.getInstance();
        if (req.params.id) {
            const id = req.params.id;
            const result = await db.outbound(id);
            res.status(200).json(util.FormatJSONData(200, '成功', result));
        } else {
            res.status(400).json(util.FormatJSONData(400, '缺少参数', null));
        }
    }catch(err){
        res.status(500).json(util.FormatJSONData(500, '服务器错误', null));
    }
}


async function update(req, res) {
    try {
        // 创建一个符合数据库模型的货架层物品更新对象
        const shelfItem = {
            shelfId: req.body.shelfId,
            layerNumber: req.body.layerNumber,
            itemId: req.body.itemId,
            status: req.body.status,
            deliveryId: req.session.user.id,
            id: req.params.id
        };

        // 获取数据库操作实例
        const db = ShelfItemDB.getInstance();

        // 执行更新操作
        const result = await db.update(shelfItem);

        // 检查是否更新成功
        if (result.affectedRows > 0) {
            // 更新成功，返回200状态码和可能的更新后货架物品信息（如果需要）
            res.json(util.FormatJSONData(200, '货架层物品更新成功', { message: '成功更新货架物品信息' }));
        } else {
            // 更新失败，返回错误信息
            res.status(400).json(util.FormatJSONData(400, '货架层物品更新失败', '没有货架物品信息被更新'));
        }
    } catch (error) {
        // 处理错误
        util.err(error);

        // 返回服务器内部错误响应
        res.status(500).json(util.FormatJSONData(500, '服务器内部错误', error));
    }
}

async function find(req, res){
    try{
        const id = req.params.id;
        const db = ShelfItemDB.getInstance();
        if (id) {
            console.log(id)
            const result = await db.find(id);
            console.log(result)
            res.status(200).json(util.FormatJSONData(200, '查询指定货架层成功', result));
        } else {
            res.status(400).json(util.FormatJSONData(400, '参数错误', null));
        }
    }catch(err){
         // 处理错误  
         util.err(err);  
  
         // 返回服务器内部错误响应  
         res.status(500).json(util.FormatJSONData(500, '服务器内部错误', err));  
    }
}

async function findAll(req, res){
    try{
        const db = ShelfItemDB.getInstance();
            const result = await db.findAll();
            res.status(200).json(util.FormatJSONData(200, '查询货架层物品列表成功', result));
    }catch(err){
         // 处理错误  
         util.err(err);  
  
         // 返回服务器内部错误响应  
         res.status(500).json(util.FormatJSONData(500, '服务器内部错误', err));  
    }
}

async function searchByStatus(req, res) {  
    try {  
        // 从请求参数中获取status、limit和offset  
        const status = req.query.status || '';  
        const limit = parseInt(req.query.limit, 10) || 10; // 设置默认limit值  
        const offset = parseInt(req.query.offset, 10) || 0; // 设置默认offset值  
        const orderBy = req.query.orderBy || 'created_at DESC'; // 设置默认排序方式  
  
        // 验证orderBy是否为有效列名（这里只是一个简单的例子，实际验证可能需要更复杂）  
        // const validOrderByColumns = ['created_at'];  
        // if (!validOrderByColumns.includes(orderBy)) {  
        //     throw new Error('Invalid orderBy column');  
        // }  
  
        // 获取数据库操作实例  
        const db = ShelfItemDB.getInstance();  
  
        // 执行查询操作  
        const result = await db.searchByStatus(status, limit, offset, orderBy);  
  
        // 返回查询结果  
        res.status(200).json(util.FormatJSONData(200, '查询货架层物品列表成功', result));  
    } catch (error) {  
        // 记录错误和上下文信息  
        util.err('Error in searchByStatus:', error,{});  
  
        // 返回错误响应  
        let errorMessage = '参数错误';  
        if (error.message) {  
            // 仅在不泄露敏感信息的情况下包含详细的错误信息  
            errorMessage += ': ' + error.message;  
        }  
        res.status(400).json(util.FormatJSONData(400, errorMessage, null));  
    }  
}

//查询自身物品列表
async function searchSelfByStatus(req, res) {  
    try {  
        const id = req.session.user.id
        // 从请求参数中获取status、limit和offset  
        const status = req.query.status || '';  
        const limit = parseInt(req.query.limit, 10) || 10; // 设置默认limit值  
        const offset = parseInt(req.query.offset, 10) || 0; // 设置默认offset值  
        const orderBy = req.query.orderBy || 'created_at DESC'; // 设置默认排序方式  
  
        // 验证orderBy是否为有效列名（这里只是一个简单的例子，实际验证可能需要更复杂）  
        // const validOrderByColumns = ['created_at'];  
        // if (!validOrderByColumns.includes(orderBy)) {  
        //     throw new Error('Invalid orderBy column');  
        // }  
  
        // 获取数据库操作实例  
        const db = ShelfItemDB.getInstance();  
  
        // 执行查询操作  
        const result = await db.searchSelfByStatus(status, limit, offset, orderBy,id);  
  
        // 返回查询结果  
        res.status(200).json(util.FormatJSONData(200, '查询货架层物品列表成功', result));  
    } catch (error) {  
        // 记录错误和上下文信息  
        util.err('Error in searchByStatus:', error,{});  
  
        // 返回错误响应  
        let errorMessage = '参数错误';  
        if (error.message) {  
            // 仅在不泄露敏感信息的情况下包含详细的错误信息  
            errorMessage += ': ' + error.message;  
        }  
        res.status(400).json(util.FormatJSONData(400, errorMessage, null));  
    }  
}

async function getCount(req, res){
    try{
      const db = ShelfItemDB.getInstance();
      const count = await db.getCount();
      res.json(util.FormatJSONData(200, "获取货层中物品数量成功", count));
  
    }catch(err){
      util.err(err);  
      // 返回服务器内部错误响应  
      res.status(500).json(util.FormatJSONData(500, '服务器内部错误', err));  
    }
  }

  async function remove(req, res){
    try{
        const db = ShelfItemDB.getInstance();
        const id = req.params.id;
        const result = await db.remove(id);
        if(result.affectedRows > 0){
            res.status(200).json(util.FormatJSONData(200, '删除货架层物品成功', result.affectedRows));
        }else{
            res.status(404).json(util.FormatJSONData(404, '删除货架层物品失败', result));
        }
    }catch(err){
        res.status(500).json(util.FormatJSONData(500, '服务器错误', err));
    }
  }

  // 引入ShelfItemDB类，确保ShelfItemDB中已包含getExpiredItems方法

async function getExpiredItems(req, res) {
    try {
        // 从请求参数中获取时间期限标识
        const val = req.params.val;

        // 使用ShelfItemDB的getExpiredItems方法获取过期物品
        const db = ShelfItemDB.getInstance();
        const expiredItems = await db.getExpiredItems(val);

        if (expiredItems && expiredItems.length > 0) {
            // 如果查询到了过期物品，返回成功信息及物品列表
            res.json(util.FormatJSONData(200, '查询过期物品成功', expiredItems));
        } else {
            // 如果没有过期物品，返回无数据的信息
            res.status(200).json(util.FormatJSONData(200, '没有过期物品', []));
        }
    } catch (error) {
        // 处理错误
        util.err(error);

        // 返回服务器内部错误响应
        res.status(500).json(util.FormatJSONData(500, '服务器内部错误', error));
    }
}

module.exports = {
    // 导出add方法
    add,
    update,
    find,
    findAll,
    getCount,
    remove,
    getExpiredItems,
    outbound,
    searchByStatus,
    searchSelfByStatus
};
